#!/usr/bin/env python
# -*- coding: utf-8 -*-
# Pinball many Balls
# beenden: pkill -9 file.py

import sys
import time
import random
import pygame
import numpy as np
import math
from copy import copy, deepcopy

ScreenW=30
ScreenH=20
Zoom=20
RasterColor=50
HindernissColor=100
xPos=ScreenW/2 # Mouse-Cursor
yPos=ScreenH/2
Laenge=5
Winkel=90

# ------------------------------------------
def Ausgabe():
  global Winkel, xPos, yPos # Zugriff auf Variable erhalten

  window.fill((0, 0, 0)) # Bildschirm loeschen

  # Raster zeichnen
  for x in range(0, ScreenW):
    pygame.draw.line(window, (RasterColor,RasterColor,RasterColor), (x*Zoom, 0), (x*Zoom, ScreenW*Zoom))
  for y in range(0, ScreenH):
    pygame.draw.line(window, (RasterColor,RasterColor,RasterColor), (0, y*Zoom), (ScreenW*Zoom, y*Zoom))

  # Bildschirm ausgeben
  for x in range(0, ScreenW):
    for y in range(0, ScreenH):
      if Bildschirm[x,y] == 1: # Hinderniss
        pygame.draw.rect(window, (HindernissColor,HindernissColor,HindernissColor), (x*Zoom,y*Zoom,1*Zoom,1*Zoom))

  # Framerate
  myfont = pygame.font.SysFont("freesans", Zoom)
  label = myfont.render(str(clock), 1, (255,255,255))
  window.blit(label, (300,0))

  # MouseCursor Home einzeichnen
  x=xPos
  y=yPos
# simples Rechteck
#  pygame.draw.rect(window, (HindernissColor,2*HindernissColor,HindernissColor), (x*Zoom,y*Zoom,1*Zoom,1*Zoom),2)
# ein Block
  for i in range(0, Laenge):
    x=int(round(xPos+i*math.sin(Winkel*math.pi/180)))
    y=int(round(yPos-i*math.cos(Winkel*math.pi/180)))
    pygame.draw.rect(window, (HindernissColor,HindernissColor,HindernissColor), (x*Zoom,y*Zoom,1*Zoom,1*Zoom))

    # Kontaktflächen ermitteln
    if Bildschirm[x,y+1]==1: # Feld darunter belegt?
      pygame.draw.rect(window, (100+HindernissColor,HindernissColor,HindernissColor), (x*Zoom,(y+1)*Zoom,1*Zoom,0.3*Zoom))
      if x>xPos: # Links von Curser?
        Winkel-=10
      if x<=xPos: 
        Winkel+=10
    if Bildschirm[x,y-1]==1: # Feld darüber belegt?
      pygame.draw.rect(window, (100+HindernissColor,HindernissColor,HindernissColor), (x*Zoom,(y)*Zoom,1*Zoom,0.3*Zoom))
      if x>xPos: # Links von Curser?
        Winkel+=10
      if x<=xPos: 
        Winkel-=10
    if Bildschirm[x-1,y]==1: # Feld links belegt?
      pygame.draw.rect(window, (100+HindernissColor,HindernissColor,HindernissColor), (x*Zoom,(y)*Zoom,0.3*Zoom,1*Zoom))
      if y>yPos: # oberhalb von Curser?
        Winkel-=10
      if y<=yPos: 
        Winkel+=10
    if Bildschirm[x+1,y]==1: # Feld rechts belegt?
      pygame.draw.rect(window, (100+HindernissColor,HindernissColor,HindernissColor), ((x+1)*Zoom,(y)*Zoom,0.3*Zoom,1*Zoom))
      if y>yPos: # oberhalb von Curser?
        Winkel+=10
      if y<=yPos: 
        Winkel-=10

  pygame.display.flip()

# ------------------------------------------
# M A I N
# ------------------------------------------
# Array 
Bildschirm=np.zeros((ScreenW,ScreenH),dtype=int) # initialisieren mit 0

# Hindernisse festlegen

# Hinderniss am Boden
for x in range(1, ScreenW-1):
  Bildschirm[x,ScreenH-2]=1
# Hinderniss Decke
for x in range(1, ScreenW-1):
  Bildschirm[x,1]=1
# Hinderniss linke Wand
for x in range(1, ScreenH-1):
  Bildschirm[1,x]=1
# Hinderniss rechte Wand
for x in range(1, ScreenH-1):
  Bildschirm[ScreenW-2,x]=1

Bildschirm[10,12]=1
Bildschirm[11,12]=1
Bildschirm[12,12]=1
Bildschirm[10,11]=1
Bildschirm[11,11]=1
Bildschirm[12,11]=1
Bildschirm[20,12]=1
Bildschirm[20,13]=1
Bildschirm[20,14]=1

#create the screen
pygame.init()
window = pygame.display.set_mode((ScreenW*Zoom,ScreenH*Zoom))

# time.sleep(10.00) # warten

#input handling
clock = pygame.time.Clock()
while True: 
  clock.tick(20) # mit 50 fps arbeiten

#  Update()
  Ausgabe()
  for event in pygame.event.get(): 
    if event.type == pygame.QUIT: 
      sys.exit(0) 
    elif event.type == pygame.MOUSEMOTION:
       x, y = event.pos
       xPos=x/Zoom; yPos=y/Zoom;
#       print "mouse at (%d, %d)" % (xPos,yPos)



